home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Nebula 1
/
Nebula One.iso
/
Financial
/
USDebtWatch
/
unix-version
/
xdebt.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-06-12
|
3KB
|
126 lines
/* Displays the current national debt in a window, updated once a second.
Public domain. By Jamie Zawinski <jwz@lucid.com>.
cc -O -o xdebt xdebt.c -lXaw -lXmu -lXt -lX11
*/
#include <stdio.h>
#include <X11/Xos.h>
#include <X11/Intrinsic.h>
#include <X11/Label.h>
/* The US National Debt, and its rate of increase as of December 31, 1988
(in dollars per second) according to the 1989 Survey of Current Business.
. These values are floats because they're >42 bits.
*/
typedef double debt_t;
#define DEBT 2707284000000.0
#define DELTA 7673.015
static struct tm debt_tm = { 0, 0, 0, 31, 11, 88 };
debt_t
national_debt_at (now)
time_t now;
{
time_t debt_date = timelocal (&debt_tm);
time_t seconds_since_then = now - debt_date;
debt_t delta_since_then = DELTA * seconds_since_then;
return DEBT + delta_since_then;
}
extern char *index ();
void
debt_to_string (debt, s)
debt_t debt;
char *s;
{
int L, i = 0;
char buf [255];
char *b = buf;
sprintf (b, "%lf", debt);
b = index (b, '.') - 1;
L = b - buf;
s += L + (L / 3);
*(s+1) = 0;
i = -1;
while (1)
{
if (++i == 3) i = 0, *s-- = ',';
if (b < buf) return;
*s-- = *b--;
}
}
static int update;
static char *defaults[] = {
"*Label.font: *-times-bold-r-*-*-*-240-*-*-*-*-*-*",
"*title: Current U.S. National Debt",
"*update: 1",
NULL
};
static XrmOptionDescRec options [] = {
{ "-update", "*update", XrmoptionSepArg, 0 }
};
static void
get_update (dpy) /* Easier than making a subclass... */
Display *dpy;
{
char *name, *class, *type, buf1[255], buf2[255];
XrmValue value;
XtGetApplicationNameAndClass (dpy, &name, &class);
sprintf (buf1, "%s.update", name);
sprintf (buf2, "%s.Update", class);
XrmGetResource (XtDatabase (dpy), buf1, buf2, &type, &value);
if (sscanf (value.addr, " %d ", &update) == 0 || update < 1)
{
fprintf (stderr, "%s: update must be a positive integer, not \"%s\"\n",
name, value.addr);
update = 1;
}
}
static void
timer (w, id)
Widget w;
XtIntervalId id;
{
char buf [255];
Arg av [10];
int ac = 0;
buf [0] = '$';
debt_to_string (national_debt_at (time ((time_t *) 0)), buf + 1);
XtSetArg (av [ac], XtNlabel, buf); ac++;
XtSetValues (w, av, ac);
XtAppAddTimeOut (XtWidgetToApplicationContext (w), update * 1000, timer, w);
}
void
main (argc, argv)
int argc;
char **argv;
{
XtAppContext app;
Widget shell = XtAppInitialize (&app, "XDebt", options, XtNumber (options),
&argc, argv, defaults, NULL, 0);
Widget label;
XEvent event;
if (argc > 1)
{
fprintf (stderr, "%s: unknown option %s\n", argv[0], argv[1]);
fprintf (stderr, "options: -update <seconds>\n\t -font <font>\n");
exit (-1);
}
label = XtCreateManagedWidget ("label", labelWidgetClass, shell, NULL, 0);
get_update (XtDisplay (label));
timer (label, 0);
XtRealizeWidget (shell);
XtAppMainLoop (app);
}